package wahadlo.math;

/**
 * Interfejs reprezentuje metody obliczania wartości funkcji. Na przykład metodę
 * Eulera czy Rungego-Kutty.
 * 
 * @author Koziołek
 * 
 */
public interface Algorithm {
	/**
	 * Metoda zwraca wartość funkcji w punkcie. Przykład:<br/> Załóżmy, że
	 * chcemy obliczyć pochodną {@link Function| funkcji} w punkcie. Mamy
	 * zadane:<br/> funkcja: F(x) = x<br/> punkt: x<sub>0</sub> = 1<br/>
	 * algorytm: naiwny z definicji f'(x) = (f(x<sub>0</sub>+h)-f(x<sub>0</sub>))/h<br/>
	 * Załóżmy ponad to, że istnieje klasa Funkcja implementująca interfejs
	 * {@link Function}. Mozna wtedy zaimplementowac interfejs
	 * {@link Algorithm} w następujacy sposób:
	 * 
	 * <pre>
	 * Function funkcja = new Funkcja();
	 * Algorithm algorithm = new Algorithm() {
	 * 	private static Double h = 0.00001;
	 * 
	 * 	public Double getValue(Function function, Double point) {
	 * 		Double fx0h = function.getValue(point + h);
	 * 		Double fx0 = function.getValue(point);
	 * 		return (fx0h - fx0) / h;
	 * 	}
	 * };
	 * 
	 * Double pochodna = algorithm.getValue(funkcja, 0.);
	 * </pre>
	 * 
	 * @param function
	 *            funkcja którą chcemy obliczyć.
	 * @param point
	 *            punkt dla którego prowadzimy wyliczenia.
	 * @return wartość funkcji w punkcie.
	 */
	public Double getValue(Function function, Double... point);
}
